home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-11 / exmacs.zip / ICLIPPER.INC < prev    next >
Text File  |  1993-01-04  |  7KB  |  274 lines

  1. extrn    __PARC:far
  2. extrn    __PARCLEN:far
  3. extrn    __PARCSIZE:far
  4. extrn    __PARDS:far
  5. extrn    __PARINFA:far
  6. extrn    __PARINFO:far
  7. extrn    __PARL:far
  8. extrn    __PARND:far
  9. extrn    __PARNI:far
  10. extrn    __PARNL:far
  11. extrn    __RET:far
  12. extrn    __RETC:far
  13. extrn    __RETCLEN:far
  14. extrn    __RETDS:far
  15. extrn    __RETL:far
  16. extrn    __RETND:far
  17. extrn    __RETNI:far
  18. extrn    __RETNL:far
  19. ;Macros to support Clipper extended function calls.
  20. ;  The Index parameter is only required for array elements.
  21. ;  If your parameter is the same as the default, it is not loaded.
  22.  
  23. ;Initialize parameter stack count
  24. CL_Pushed    =   0
  25.  
  26. ;Miscellaneous Constants
  27. CL_Undefined    =   0    ;Parameter Typing
  28. CL_Character    =   1
  29. CL_Numeric    =   2
  30. CL_Logical    =   4
  31. CL_Date     =   8
  32. CL_Alias    =   16
  33. CL_Pointer    =   32
  34. CL_Memo     =   65
  35. CL_Word     =   128
  36. CL_Array    =   512
  37.  
  38. CL_True     =   1    ;Logical Values
  39. CL_False    =   0
  40.  
  41. ;Push required parameter for Clipper call, checks parameter existance
  42. ; tracks stack use
  43. ; Force_DGROUP causes DS save/restore to ensure DS = DGROUP during call
  44. ;   ds is saved on the stack before all arguments
  45. ;   Default is normally a register, but may be a memory reference.
  46. macro    CL_Push     Default, Actual
  47.     if Force_DGROUP NE 0
  48.     if CL_Pushed EQ 0
  49.         push    ds            ;;ds wasn't saved earlier
  50.     endif
  51.     endif
  52.     ifb <Actual>
  53.     display  "Required parameter missing."
  54.     err
  55.     else
  56.     ifdifi <Default>, <Actual>
  57.         mov     Default, Actual
  58.     endif
  59.     push    Default
  60.     CL_Pushed   =    CL_Pushed + 2
  61.     endif
  62. endm    CL_Push
  63.  
  64. ;Push optional parameter for Clipper call, checks parameter existance,
  65. ; tracks stack use
  66. ;   Default is normally a register, but may be a memory reference.
  67. macro    CL_PushOpt  Default, Actual
  68.     ifnb <Actual>
  69.     CL_Push <Default>, <Actual>
  70.     endif
  71. endm    CL_PushOpt
  72.  
  73. ;Call Clipper Extend service routine and  clear the stack,
  74. ; Force_DGROUP causes DS save/restore to ensure DS = DGROUP during call
  75. ;   See macro Save_DGROUP and CL_Push
  76. ;   DGROUP must have been saved in Save_DGROUP
  77. ;   ds is saved on the stack before all arguments
  78. macro    CL_Call     Routine
  79.     if Force_DGROUP NE 0
  80.     if CL_Pushed EQ 0
  81.         push    ds            ;;ds wasn't saved earlier
  82.     endif
  83.     mov    ds, [Save_DGROUP]    ;;point to DGROUP
  84.     endif
  85.     call    Routine
  86.     if CL_Pushed NE 0
  87.     add    SP, CL_Pushed        ;;clear stack
  88.     CL_Pushed   =    0
  89.     endif
  90.     ifnb <Force_DGROUP>
  91.     pop    ds            ;;restore normal ds
  92.     endif
  93. endm    CL_Call
  94.  
  95. ;Save DGROUP value for Clipper Extend service routine calls
  96. ; Invoke on entry from Clipper before ds is changed
  97. ; Sets:
  98. ;   Save_DGROUP  = DS at entry to macro (DGROUP when called by Clipper)
  99. ; Defines:
  100. ;   Force_DGROUP = 0 = Don't force DGROUP in CL_Push/CL_Call
  101. ;           1 = Force DGROUP in CL_Push/CL_Call, restore ds after call
  102. macro    Save_DGROUP
  103.     Force_DGROUP    =        1
  104.     mov [Save_DGROUP], ds
  105. endm    Save_DGROUP
  106.  
  107. ;Get number of elements in an array parameter
  108. ;  Returns in ax
  109. ;  Uses ax, dx
  110. macro    CL_AParCount    ParameterNumber
  111.     CL_ParInfa    ParameterNumber, 0
  112. endm    CL_AParCount
  113.  
  114. ;Get number of parameters passed
  115. ;  Returns in ax
  116. ;  Uses ax
  117. macro    CL_ParCount
  118.     CL_ParInfo    0
  119. endm    CL_ParCount
  120.  
  121. ;Get a String parameter
  122. ;   Returns pointer in dx:ax
  123. ;   Uses ax, dx
  124. macro    CL_ParC     ParameterNumber, Index
  125.     CL_PushOpt    dx, <Index>
  126.     CL_Push    ax, <ParameterNumber>
  127.     CL_Call    __PARC
  128. endm    CL_ParC
  129.  
  130. ;Get a String parameter's length
  131. ;   Returns length in ax
  132. ;   Uses ax, dx
  133. macro    CL_ParCLen  ParameterNumber, Index
  134.     CL_PushOpt    dx, <Index>
  135.     CL_Push    ax, <ParameterNumber>
  136.     CL_Call    __PARCLEN
  137. endm    CL_ParCLen
  138.  
  139. ;Get a String parameter's allocated size
  140. ; Parameter must be passed by reference (@).
  141. ;   Returns size in ax
  142. ;    0 = Constant was passed
  143. ;   Uses ax, dx
  144. macro    CL_ParCSize ParameterNumber, Index
  145.     CL_PushOpt    dx, <Index>
  146.     CL_Push    ax, <ParameterNumber>
  147.     CL_Call    __PARCSIZE
  148. endm    CL_ParCSize
  149.  
  150. ;Get a Date parameter as "YYYYMMDD"
  151. ;   Returns pointer in dx:ax
  152. ;   Uses ax, dx
  153. macro    CL_ParDS    ParameterNumber, Index
  154.     CL_PushOpt    dx, <Index>
  155.     CL_Push    ax, <ParameterNumber>
  156.     CL_Call    __PARDS
  157. endm    CL_ParDS
  158.  
  159. ;Get parameter array element type
  160. ;  Returns element description in ax
  161. ;  Uses ax, dx
  162. macro    CL_ParInfa  ParameterNumber, Index
  163.     CL_Push    dx, <Index>
  164.     CL_Push    ax, <ParameterNumber>
  165.     CL_Call    __PARINFA
  166. endm    CL_ParInfa
  167.  
  168. ;Get parameter type
  169. ;  Returns parameter description in ax
  170. ;  Uses ax
  171. macro    CL_ParInfo  ParameterNumber
  172.     CL_Push    ax, <ParameterNumber>
  173.     CL_Call    __PARINFO
  174. endm    CL_ParInfo
  175.  
  176. ;Get a Logical parameter
  177. ;  Returns in ax
  178. ;  Uses ax, dx
  179. macro    CL_ParL     ParameterNumber, Index
  180.     CL_PushOpt    dx, <Index>
  181.     CL_Push    ax, <ParameterNumber>
  182.     CL_Call    __PARL
  183. endm    CL_ParL
  184.  
  185. ;Get a Numeric double precision parameter
  186. ;   Returns pointer to double precision parameter in dx:ax
  187. ;   Uses ax, dx
  188. macro    CL_ParND    ParameterNumber, Index
  189.     CL_PushOpt    dx, <Index>
  190.     CL_Push    ax, <ParameterNumber>
  191.     CL_Call    __PARND
  192. endm    CL_ParND
  193.  
  194. ;Get a Numeric integer parameter
  195. ;  Returns in ax
  196. ;  Uses ax, dx
  197. macro    CL_ParNI    ParameterNumber, Index
  198.     CL_PushOpt    dx, <Index>
  199.     CL_Push    ax, <ParameterNumber>
  200.     CL_Call    __PARNI
  201. endm    CL_ParNI
  202.  
  203. ;Get a Numeric long integer parameter
  204. ;  Returns in dx:ax
  205. ;  Uses ax, dx
  206. macro    CL_ParNL    ParameterNumber, Index
  207.     CL_PushOpt    dx, <Index>
  208.     CL_Push    ax, <ParameterNumber>
  209.     CL_Call    __PARNL
  210. endm    CL_ParNL
  211.  
  212. ;Indicate no return value
  213. macro    CL_Ret
  214.     CL_Call    __Ret
  215. endm    CL_Ret
  216.  
  217. ;Return a String
  218. ;   Uses dx:ax
  219. macro    CL_RetC     Segment, Offset
  220.     CL_Push    dx, <Segment>
  221.     CL_Push    ax, <Offset>
  222.     CL_Call    __RETC
  223. endm    CL_RetC
  224.  
  225. ;Return a String with length
  226. ;   Uses dx:ax, cx
  227. macro    CL_RetCLen  Segment, Offset, Length
  228.     CL_Push    cx, <Length>
  229.     CL_Push    dx, <Segment>
  230.     CL_Push    ax, <Offset>
  231.     CL_Call    __RETCLEN
  232. endm    CL_RetCLen
  233.  
  234. ;Return a Date as "YYYYMMDD"
  235. ;   Uses dx:ax
  236. macro    CL_RetDS    Segment, Offset
  237.     CL_Push    dx, <Segment>
  238.     CL_Push    ax, <Offset>
  239.     CL_Call    __RETDS
  240. endm    CL_RetDS
  241.  
  242. ;Return a Logical value (true = non-zero (normally 1))
  243. ;  Uses ax
  244. macro    CL_RetL     Value
  245.     CL_Push    ax, <Value>
  246.     CL_Call    __RETL
  247. endm    CL_RetL
  248.  
  249. ;Return a Numeric double precision value
  250. ;   Uses dx:cx:bx:ax
  251. macro    CL_RetND    Word3, Word2, Word1, Word0
  252.     CL_Push    dx, <Word3>
  253.     CL_Push    cx, <Word2>
  254.     CL_Push    bx, <Word1>
  255.     CL_Push    ax, <Word0>
  256.     CL_Call    __RETND
  257. endm    CL_RetND
  258.  
  259. ;Return a Numeric integer
  260. ;  Uses ax
  261. macro    CL_RetNI    Value
  262.     CL_Push    ax, <Value>
  263.     CL_Call    __RETNI
  264. endm    CL_RetNI
  265.  
  266. ;Return a Numeric long integer
  267. ;  Uses dx:ax
  268. macro    CL_RetNL    MSW, LSW
  269.     CL_Push    dx, <MSW>
  270.     CL_Push    ax, <LSW>
  271.     CL_Call    __RETNL
  272. endm    CL_RetNL
  273.  
  274.